const fs = require('fs');
const path = require('path');
const { parseExcelFiles } = require('./dataParser');
const { fractionNameKeyMap } = require('./nameKeyMap');

// 根据参数解析文件
async function parseFilesByParams(province, city, date, filterOptions = {}) {
  // 使用相对于项目根目录的路径
  const baseDir = path.join(__dirname, '../shoreFile');
  
  // 检查目录是否存在
  if (!fs.existsSync(baseDir)) {
    throw new Error(`基础目录不存在: ${baseDir}`);
  }
  
  // 构建文件路径（不包含扩展名）
  const positionDir = path.join(baseDir, province, date, '省考', '职位表');
  
  // 查找职位表文件
  const positionFile = await findFileWithExtension(positionDir, city);
  if (!positionFile) {
    const availableFiles = await getAvailablePositionFiles(baseDir, province, date);
    throw new Error(`职位表文件不存在: ${positionDir}/${city}。可用文件: ${availableFiles.join(', ')}`);
  }
  
  // 构建完整文件路径
  const positionFilePath = path.join(positionDir, positionFile);
  
  // 解析文件
  return await parseExcelFiles(positionFilePath, date, city, province, filterOptions);
}

// 根据职位代码解析分数数据
async function parseScoreByPositionCode(province, city, date, positionCode) {
  // 使用相对于项目根目录的路径
  const baseDir = path.join(__dirname, '../shoreFile');
  
  // 检查目录是否存在
  if (!fs.existsSync(baseDir)) {
    throw new Error(`基础目录不存在: ${baseDir}`);
  }
  
  // 构建文件路径（不包含扩展名）
  const scoreDir = path.join(baseDir, province, date, '省考', '分数表');
  
  // 查找分数表文件
  const scoreFile = await findFileWithExtension(scoreDir, city);
  if (!scoreFile) {
    const availableFiles = await getAvailableScoreFiles(baseDir, province, date);
    throw new Error(`分数表文件不存在: ${scoreDir}/${city}。可用文件: ${availableFiles.join(', ')}`);
  }
  
  // 构建完整文件路径
  const scoreFilePath = path.join(scoreDir, scoreFile);
  
  // 解析分数文件
  const scoreData = await parseScoreFile(scoreFilePath);
  
  // 获取分数表实际表头
  const scoreHeaders = scoreData.length > 0 ? Object.keys(scoreData[0]) : [];
  
  // 过滤出实际存在的字段映射
  const availableFractionMappings = fractionNameKeyMap.filter(mapping => 
    scoreHeaders.includes(mapping.name) || mapping.name === '排名'
  );
  
  // 过滤指定职位代码的数据
  const filteredData = scoreData.filter(item => item['职位代码'] === positionCode);
  
  // 按笔试成绩排序并添加排名
  const sortedData = filteredData
    .sort((a, b) => (b['笔试成绩'] || 0) - (a['笔试成绩'] || 0))
    .map((item, index) => ({
      ...item,
      排名: index + 1
    }));
  
  // 转换数据格式
  const data = sortedData.map(item => {
    const result = {};
    availableFractionMappings.forEach(mapping => {
      result[mapping.key] = item[mapping.name] !== null && item[mapping.name] !== undefined ? 
        item[mapping.name] : '';
    });
    return result;
  });
  
  return {
    province: province,
    date: date,
    city: city,
    positionCode: positionCode,
    fractionNameKeyMap: availableFractionMappings,
    data: data
  };
}

// 解析分数表文件
async function parseScoreFile(filePath) {
  const { parseExcelFile } = require('./excelParser');
  // 分数表：第三行为表头，第四行开始是数据
  return await parseExcelFile(filePath, 3, 4);
}

// 查找带有扩展名的文件
async function findFileWithExtension(dirPath, baseName) {
  try {
    if (!fs.existsSync(dirPath)) {
      return null;
    }
    
    const files = fs.readdirSync(dirPath);
    
    // 查找匹配的文件（支持 .xls 和 .xlsx 扩展名）
    const matchingFile = files.find(file => {
      const fileName = path.parse(file).name;
      return fileName === baseName && /\.(xls|xlsx)$/i.test(file);
    });
    
    return matchingFile || null;
  } catch (error) {
    console.error(`查找文件时出错: ${dirPath}`, error);
    return null;
  }
}

// 获取可用的职位表文件列表
async function getAvailablePositionFiles(baseDir, province, date) {
  try {
    const positionDir = path.join(baseDir, province, date, '省考', '职位表');
    if (!fs.existsSync(positionDir)) {
      return [];
    }
    
    return fs.readdirSync(positionDir).filter(file => 
      /\.(xls|xlsx)$/i.test(file)
    );
  } catch (error) {
    console.error('获取职位表文件列表时出错:', error);
    return [];
  }
}

// 获取可用的分数表文件列表
async function getAvailableScoreFiles(baseDir, province, date) {
  try {
    const scoreDir = path.join(baseDir, province, date, '省考', '分数表');
    if (!fs.existsSync(scoreDir)) {
      return [];
    }
    
    return fs.readdirSync(scoreDir).filter(file => 
      /\.(xls|xlsx)$/i.test(file)
    );
  } catch (error) {
    console.error('获取分数表文件列表时出错:', error);
    return [];
  }
}

module.exports = {
  parseFilesByParams,
  parseScoreByPositionCode,
  getAvailablePositionFiles,
  getAvailableScoreFiles
};